package me.sunpeng.Wildcard.demo;

import java.util.ArrayList;

/**
 * 泛型通配符
 * <p>
 * 需求：
 * 定义一个方法，形参是一个集合，但是集合中的数据类型不确定。
 * ? extends 应用
 *
 * @author sp
 */
public class GenericTypeDemo1 {

    public static void keepPet1(ArrayList<? extends Cat> list) {
        //遍历集合，调用动物的eat方法
        for (Cat cat : list) {
            cat.eat();
        }
    }

    //  要求2：该方法能养所有品种的狗，但是不能养猫
    public static void keepPet2(ArrayList<? extends Dog> list) {
        //遍历集合，调用动物的eat方法
        for (Dog dog : list) {
            dog.eat();
        }
    }

    //  要求3：该方法能养所有的动物，但是不能传递其他类型
    public static void keepPet3(ArrayList<? extends Animal> list) {
        //遍历集合，调用动物的eat方法
        for (Animal animal : list) {
            animal.eat();
        }
    }


    /**
     * 定义一个继承结构：
     * 动物
     * |                           |
     * 猫                          狗
     * |      |                    |      |
     * 波斯猫   狸花猫                泰迪   哈士奇
     */
    public static void main(String[] args) {

        HuskyDog h = new HuskyDog("哈士奇", 1);
        LihuaCat l = new LihuaCat("狸花猫", 2);

        ArrayList<HuskyDog> list1 = new ArrayList<>();
        list1.add(h);
        ArrayList<LihuaCat> list2 = new ArrayList<>();
        list2.add(l);

        keepPet1(list2);
        keepPet2(list1);


        keepPet3(list1);
        keepPet3(list2);


    }


}
